#include <bits/stdc++.h>

#define in read()
#define fi first
#define se second
#define pb push_back
#define y1 y_alpha_1

using namespace std;

using ll = long long;
using db = double;
using vec = vector<int>;
using pii = pair<int,int>;

int read() {
	int x = 0; bool f = 0; char ch = getchar();
	while(!isdigit(ch)) f |= ch == '-',ch = getchar();
	while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48),ch = getchar();
	return f ? -x : x;
}

const int N = 4e5 + 10;

int n,m,incf[N],pref[N],p[N],s[N],b[N];
int a[N],tot,cnt,ans[N];

int pos(int x) { return lower_bound(a + 1,a + tot + 1,x) - a; }

struct line { int ti,x,y,op,id; } l[N];

struct BIT {
	int tr[N];
	void add(int x,int y) { for(;x <= tot;x += x & -x) tr[x] += y; }
	int query(int x,int y = 0) { for(;x;x -= x & -x) y += tr[x]; return y; }
}A,B;

int main() {
#ifndef ONLINE_JUDGE
	freopen("1.in","r",stdin);
#endif
	n = in,m = in; for(int i = 1;i <= n;i++) p[i] = in; for(int i = 1;i <= n;i++) s[i] = in; for(int i = 1;i <= n;i++) b[i] = in;
	for(int i = 1;i <= m;i++) incf[i] = in; for(int i = 1;i <= m;i++) pref[i] = in;
	for(int i = 1;i <= n;i++) a[++tot] = b[i] + p[i],a[++tot] = b[i] - p[i] + 1;
	for(int i = 1;i <= m;i++) a[++tot] = incf[i] + pref[i],a[++tot] = pref[i] - incf[i];
	sort(a + 1,a + tot + 1); tot = unique(a + 1,a + tot + 1) - a - 1; 
	for(int i = 1;i <= n;i++) l[++cnt] = (line) { p[i],p[i],b[i],1,0 },l[++cnt] = (line) { s[i] + 1,p[i],b[i],-1,0 };
	for(int i = 1;i <= m;i++) l[++cnt] = (line) { incf[i],incf[i],pref[i],2,i };
	sort(l + 1,l + cnt + 1,[](line a,line b) { return a.ti == b.ti ? a.id == b.id ? a.op > b.op : a.op < b.op : a.ti < b.ti; });
	for(int i = 1;i <= cnt;i++) {
		if(l[i].id) 
			ans[l[i].id] = A.query(pos(l[i].x + l[i].y)) - B.query(pos(l[i].y - l[i].x));
		else 
			A.add(pos(l[i].x + l[i].y),l[i].op),B.add(pos(l[i].y - l[i].x + 1),l[i].op);
	}
	for(int i = 1;i <= m;i++) printf("%d%c",ans[i]," \n"[i == m]);
	return 0;
}
